# -*- coding: utf-8 -*-
from django.core.exceptions import ValidationError
import re


class CustomPasswordValidator:
    """
    自定义密码验证器，允许6位数字密码，并提供中文错误消息
    同时支持原有的密码验证规则
    """

    def __init__(self):
        self.min_length = 6

    def validate(self, password, user=None):
        """
        验证密码是否满足要求
        """
        # 如果是6位纯数字，直接通过
        if re.match(r'^\d{6}$', password):
            return

        # 否则检查密码长度
        if len(password) < self.min_length:
            raise ValidationError(
                f"密码长度不足，至少需要 {self.min_length} 个字符",
                code='password_too_short',
            )

    def get_help_text(self):
        """
        帮助文本，显示在密码字段旁
        """
        return f"您的密码必须包含至少 {self.min_length} 个字符，或者是6位数字。"


class ChineseMinimumLengthValidator:
    """
    最小长度验证器（中文版）
    """

    def __init__(self, min_length=8):
        self.min_length = min_length

    def validate(self, password, user=None):
        if len(password) < self.min_length:
            raise ValidationError(
                f"密码长度不足，至少需要 {self.min_length} 个字符",
                code='password_too_short',
            )

    def get_help_text(self):
        return f"您的密码必须包含至少 {self.min_length} 个字符。"


class ChineseUserAttributeSimilarityValidator:
    """
    用户属性相似度验证器（中文版）
    """

    def __init__(self, user_attributes=None, max_similarity=0.7):
        self.user_attributes = user_attributes or ('username', 'first_name', 'last_name', 'email')
        self.max_similarity = max_similarity

    def validate(self, password, user=None):
        if not user:
            return

        # 检查密码与用户属性的相似度
        for attribute_name in self.user_attributes:
            value = getattr(user, attribute_name, None)
            if not value or not isinstance(value, str):
                continue

            if value.lower() in password.lower():
                raise ValidationError(
                    f"密码与您的{self._attribute_name_to_chinese(attribute_name)}太相似",
                    code='password_too_similar',
                )

    def _attribute_name_to_chinese(self, name):
        """将属性名转换为中文"""
        mapping = {
            'username': '用户名',
            'first_name': '名字',
            'last_name': '姓氏',
            'email': '邮箱',
        }
        return mapping.get(name, name)

    def get_help_text(self):
        return "您的密码不能与您的个人信息太相似。"


class ChineseCommonPasswordValidator:
    """
    常见密码验证器（中文版）
    """

    def validate(self, password, user=None):
        # 常见密码列表（示例）
        common_passwords = ['password', '123456', 'qwerty', 'admin', 'welcome']
        if password.lower() in common_passwords:
            raise ValidationError(
                "这个密码太常见了，请使用更安全的密码",
                code='password_too_common',
            )

    def get_help_text(self):
        return "您的密码不能是常见密码（如 'password', '123456' 等）。"


class ChineseNumericPasswordValidator:
    """
    数字密码验证器（中文版）
    允许6位纯数字密码，否则不允许纯数字密码
    """

    def validate(self, password, user=None):
        # 6位纯数字密码是允许的
        if re.match(r'^\d{6}$', password):
            return

        # 其他纯数字密码不允许
        if password.isdigit():
            raise ValidationError(
                "密码不能全是数字，除非是6位数字密码",
                code='password_entirely_numeric',
            )

    def get_help_text(self):
        return "您的密码不能全是数字，除非是6位数字密码。"
